<?php 

class usuario_perfilModel extends Model{
    public  $tabela = "usuario_perfil";
    public  $pkey   = 'usuario_perfil_cod';
    private $cookie_perm = "usuario_perm";
    public $dados  = array(
         'usuario_perfil_cod' => array(
	    'name'     => 'Cod',
	    'type'     => 'int',
	    'size'     => '11',
	    'pkey'    => true,
	    'ai'      => true,
	    'grid'    => true,
	    'display' => true,
	    'private' => true
        ),
         'usuario_perfil_nome' => array(
	    'name'     => 'Nome',
	    'type'     => 'varchar',
	    'size'     => '32',
	    'notnull' => true,
	    'grid'    => true,
	    'display' => true,
        ),
         'usuario_perfil_descricao' => array(
	    'name'     => 'Detalhes do Perfil',
	    'type'     => 'varchar',
	    'size'     => '256',
	    'notnull' => true,
	    'grid'    => true,
	    'display' => true,
        ),
        'usuario_perfil_default' => array(
	    'name'     => 'Padrão',
	    'type'     => 'bit',
	    'default'  => '0',
	    'notnull' => true,
	    'grid'    => true,
            'especial'=> 'hide',
	    'display' => true,
        ),
        
        'usuario_perfil_tipo' => array(
	    'name'     => 'Tipo de Perfil',
	    'type'     => 'enum',
	    'default'  => 'usuario',
            'options' => array(
                'sistema' => 'Sistema',
                'usuario' => 'Usuário'
            ),
	    'notnull' => true,
	    'grid'    => true,
            'especial'=> 'hide',
	    'display' => true,
        ),
        
        'usuario_login' => array(
	    'name'     => 'Usuários com este Perfil',
            'especial' => 'hide',
            'display_in' => 'table',
	    'fkey' => array(
	        'model' => 'usuario/login',
	        'cardinalidade' => 'n1',
	        'keys' => array('cod_usuario', 'user_name', 'user_cargo'),
	    ),
        ),
        
        'button' => array(
            'button' => "Salvar Perfil",
        )
    );
    
    public function __construct() {
        parent::__construct();
        $this->LoadModel('plugins/permissao', 'perm');
        $this->LoadModel('plugins/plug', 'plug');
    }
    
    public function getPerfis(){
        $this->LoadModel('usuario/login', 'uobj');
        $perfil = $this->uobj->getCodPerfil();
        $where  = "usuario_perfil_cod NOT IN(".Webmaster.", ".Admin.", $perfil)"; 
        return $this->selecionar(array(), $where);
    }

    /*
     * Retorna o código do perfil de usuário, se o valor enviado é um array, procura pelo índice
     * usuario_perfil_cod, se for um número, retorna o próprio número
     */
    public function getCodPerfil($cod_perfil){
        return (is_array($cod_perfil) && array_key_exists("usuario_perfil_cod", $cod_perfil))?$cod_perfil['usuario_perfil_cod']:$cod_perfil;
    }
    
    /*
     * Retorna o nome do perfil de usuário enviado por parâmetro. 
     */
    public function getNamePerfil($perfil){
        return (!is_array($perfil) || !array_key_exists("usuario_perfil_nome", $perfil))?"":$perfil['usuario_perfil_nome'];
    }
    
    /*
     * Torna um perfil como padrão
     */
    public function setDefaultPerfil($cod_perfil){
        if($cod_perfil == Webmaster || $cod_perfil == Admin) {
            $this->setErrorMessage("Os Perfis de Administrador não podem ser marcados como padrão!");
            return false;
        }
        $query = "UPDATE $this->tabela SET usuario_perfil_default = 0";
        if(!$this->db->ExecuteInsertionQuery($query)){
            //echo $this->db->getSentenca();
            if(DEBUG)$this->setErrorMessage($this->db->getErrorMessage());
            else     $this->setErrorMessage("Não foi possível marcar o perfil como padrão.");
            return false;
        }
        
        $query = "UPDATE $this->tabela SET usuario_perfil_default = 1 WHERE usuario_perfil_cod  = '$cod_perfil'";
        if(!$this->db->ExecuteInsertionQuery($query)){
            //echo $this->db->getSentenca();
            if(DEBUG)$this->setErrorMessage($this->db->getErrorMessage());
            else     $this->setErrorMessage("Não foi possível marcar o perfil como padrão.");
            return false;
        }
        
        $this->setSuccessMessage("Perfil padrão alterado com sucesso!");
        
        return true;
    }
    
    
    /*
     * retorna o código e o nome do perfil padrão do sistema. Se não tiver nenhum o perfil
     * de visitante é retornado
     */
    public function getDefaultPerfil(){
        return array();
        $var = $this->selecionar(array('usuario_perfil_cod', 'usuario_perfil_nome'), "usuario_perfil_default = '1'", 1);
        if(empty($var)) return array('1' => "Visitante");
        $var = array_shift($var);
        return array($var['usuario_perfil_cod'] => $var["usuario_perfil_nome"]);
    }
    
    //edita os dados contanto que o perfil não seja de um perfil incial do sistema
    public function editar($id, $post, $camp = "") {
        if(!$this->perfil_padrao_erro($id)) return false;
        return parent::editar($id, $post, $camp);
    }
    
    //apaga os dados contanto que o perfil não seja de um perfil incial do sistema
    public function apagar($valor, $chave = "") {
        if(!$this->perfil_padrao_erro($valor)) return false;
        return parent::apagar($valor, $chave);
    }
    
    /*
     * checa se o código do perfil está dentro os perfis iniciais do sistema (que não podem ter os dados alterados e não
     * podem ser excluídos)
     */
    private function perfil_padrao_erro($id){
        $total = $this->getCount("usuario_perfil_tipo = 'sistema' AND usuario_perfil_cod = '$id'");
        if($total > 0){
            $this->setErrorMessage('Não é possível editar ou apagar um perfil padrão do sistema');
            return false;
        }
        return true;
    }
    
    /*
     * Compara o código de um perfil passado por parâmetro com 
     * o código do usuário que está online
     * Retorna true caso sejam iguais, false caso o contrário
     */
    public function checkPerfilIsOwnUser($cod){
        $this->LoadModel('usuario/login', 'uobj');
        return($this->uobj->getCodPerfil() == $cod);
    }
    

    
    
    public function hasPermissionByName($permname){
        $this->LoadClassFromPlugin('usuario/perfil/perfilPermissions', 'pp');
        return $this->pp->hasPermissionByName($permname);
    }
    
    /*
     * Recebe uma string contento Plugin/Subplugin/Action
     * Retorna true caso o usuário tenha permissão de acessar o sistema,
     * false caso contrário
     */
    public function hasPermission(&$action_name, $getPermissionString = false, $update_permissions = false){
        $this->LoadClassFromPlugin('usuario/perfil/perfilPermissions', 'pp');
        return $this->pp->hasPermission($action_name, $getPermissionString, $update_permissions);
    }
}
?>